package queue;

class MyCircularQueue {
// 定义下用来组织数据的数组
private int[] elementData;
// 队首的下标
private int front;
// 队尾的下标
private int rear;

public MyCircularQueue(int k) {
// 用冗余最后一个数组空间的方式去处理，这时要让k + 1，真实存储数据的大小不变
elementData = new int[k + 1];

}

/**
* 入队
* @param value：入队元素
* @return
*/
public boolean enQueue(int value) {
if (isFull()) {
return false;
}
// 开始处理数组元素与下标
    elementData[rear]=value;
    rear=(rear+1)%elementData.length;
    return true;
}

/**
* 出队
* @return
*/
public boolean deQueue() {
    //判断队列是否为空
    if (front==rear){
       return false;
    }
    else{
        int num=elementData[front];
        front=(front+1)% elementData.length;
        return true;
    }
}
    /**
     * 获取队首元素
     * @return
     */
    public int Front() {
    if (isEmpty()){
        return-1;
    }
    return elementData[front];
    }

    /**
     * 获取队尾元素
     * @return
     */
    public int Rear() {
        //判断队列是否为空
        if(isEmpty()){
            return -1;
        }
        //在不是空的情况下返回这个
        return elementData[(rear+elementData.length-1)%elementData.length];
    }

    /**
     * 队列是否为空
     * @return
     */
    public boolean isEmpty() {
        if(front==rear){
            return true;
        }
        else {
            return false;
        }
    }

    /**
     * 队列是否满
     * @return
     */
    public boolean isFull() {
        return ((rear + 1) % elementData.length == front);
    }
}